#pragma once
#include <string>
#include <memory>
#include "framework/request.h"
#include "framework/response.h"
#include "logger/LoggerManager.h"
namespace cpp_backend
{
    namespace framework
    {
        class IService
        {
        public:
            ~IService() = default;
            /**
             * @brief 服务初始化
             * 在服务启动时候调用，用于初始化服务资源(数据库连接，配置加载等)
             * @return 是否初始化成功
             */
            virtual bool Initialize() = 0;
            /**
             * @brief 启动服务
             * 初始化成功后调用，开始提供服务
             * @return 是否初始化成功
             */
            virtual bool Start() = 0;
            /**
             * @brief 停止服务
             */
            virtual void Stop() = 0;
            /**
             * @brief 健康检查
             * 服务启动后，会定时调用此方法，检查服务是否正常
             * @return 服务是否正常
             */
            virtual bool HealthCheck() = 0;
            /**
             * @brief 获取服务名称
             * 唯一标识服务，用于服务注册和路由
             * @return 服务名称(如："user_service","file_service")
             */
            virtual std::string GetServiceName() const = 0;
            /**
             * @brief 获取服务版本
             * 用于版本管理和兼容性检查
             * @return 服务版本（如 "1.0.0"）
             *
             */
            virtual std::string GetServiceVersion() const = 0;
            /**
             * @brief 获取服务描述
             * 用于文档生成和服务发现
             * @return 服务描述
             */
            virtual std::string GetServicedescription() const
            {
                return "No decription";
            }
            /**
             * @brief 处理请求（统一入口）
             * 所有的请求都通过此接口进入服务
             * 服务内部根据请求路径/方法分发到具体的Handler
             * @param request 请求对象
             * @return 响应对象
             */
            virtual Response HandleRequest(const Request &request) = 0;
            /**
             * @brief 异步处理请求
             * 对于耗时操作，可以实现异步版本
             * 默认实现为同步调用HandleRequest
             * @param request 请求对象
             * @return callback 回调函数
             */
            virtual void HandleRequestAsync(const Request &request,
                                            std::function<void(const Response &)> callback)
            {
                Response resp = HandleRequest(request);
                if (callback)
                {
                    callback(resp);
                }
            }
            /**
             * 获取服务统计信息
             * 用于监控和性能分析
             * @return JSON格式的统计信息
             */
            virtual nlohmann::json GetStatistics() const
            {
                nlohmann::json stats;
                stats["service_name"] = GetServiceName();
                stats["service_version"] = GetServiceVersion();
                stats["service_description"] = GetServicedescription();
                stats["service_status"] = "running";

                return stats;
            }
        };
        using IServicePtr = std::shared_ptr<IService>;
        /**
         * @brief 服务基类（提供通用实现）
         * 业务可以集成此类，减少重复代码
         */
        class ServiceBase : public IService
        {
        public:
            ServiceBase(const std::string &name, const std::string &version) : server_name_(name), service_version_(version)
            {
            }
            virtual ~ServiceBase() = default;
            // 子类重写此接口进行自定义初始化逻辑
            bool Initialize() override
            {
                return true;
            }
            bool Start() override
            {
                is_running_ = true;
                return is_running_;
            }
            void Stop() override
            {
                is_running_ = false;
            }
            bool HealthCheck() override
            {
                return is_running_;
            }
            std::string GetServiceName() const override
            {
                return server_name_;
            }
            std::string GetServiceVersion() const override
            {
                return service_version_;
            }

            bool IsRunning() const
            {
                return is_running_;
            }

        protected:
            std::string server_name_;
            std::string service_version_;
            bool is_running_ = false;
        };
    }
}